#include "ControladorDeJugador.h"

ControladorDeJugador::ControladorDeJugador(Entidad* _modelo)
{
	modelo = _modelo;

	tecla_activa[ARRIBA] = false;
	tecla_activa[ABAJO] = false;
	tecla_activa[DERECHA] = false;
	tecla_activa[IZQUIERDA] = false;
	
	callbacks[TOCAR][ARRIBA] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlTocarArriba);
	Core::Instancia()->Teclas().al_tocar.arriba.Suscribir(&callbacks[TOCAR][ARRIBA]);
	callbacks[TOCAR][ABAJO] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlTocarAbajo);
	Core::Instancia()->Teclas().al_tocar.abajo.Suscribir(&callbacks[TOCAR][ABAJO]);
	callbacks[TOCAR][DERECHA] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlTocarDerecha);
	Core::Instancia()->Teclas().al_tocar.derecha.Suscribir(&callbacks[TOCAR][DERECHA]);
	callbacks[TOCAR][IZQUIERDA] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlTocarIzquierda);
	Core::Instancia()->Teclas().al_tocar.izquierda.Suscribir(&callbacks[TOCAR][IZQUIERDA]);
	
	callbacks[SOLTAR][ARRIBA] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlSoltarArriba);
	Core::Instancia()->Teclas().al_soltar.arriba.Suscribir(&callbacks[SOLTAR][ARRIBA]);
	callbacks[SOLTAR][ABAJO] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlSoltarAbajo);
	Core::Instancia()->Teclas().al_soltar.abajo.Suscribir(&callbacks[SOLTAR][ABAJO]);
	callbacks[SOLTAR][DERECHA] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlSoltarDerecha);
	Core::Instancia()->Teclas().al_soltar.derecha.Suscribir(&callbacks[SOLTAR][DERECHA]);
	callbacks[SOLTAR][IZQUIERDA] = Callback<ControladorDeJugador>(this,&ControladorDeJugador::AlSoltarIzquierda);
	Core::Instancia()->Teclas().al_soltar.izquierda.Suscribir(&callbacks[SOLTAR][IZQUIERDA]);
	
	callback_actualizar = Callback<ControladorDeJugador>(this,&ControladorDeJugador::Actualizar);
	Core::Instancia()->AgregarCallback(&callback_actualizar);
}

ControladorDeJugador::~ControladorDeJugador()
{
	Core::Instancia()->Teclas().al_tocar.arriba.Dessuscribir(&callbacks[TOCAR][ARRIBA]);
	Core::Instancia()->Teclas().al_tocar.abajo.Dessuscribir(&callbacks[TOCAR][ABAJO]);
	Core::Instancia()->Teclas().al_tocar.derecha.Dessuscribir(&callbacks[TOCAR][DERECHA]);
	Core::Instancia()->Teclas().al_tocar.izquierda.Dessuscribir(&callbacks[TOCAR][IZQUIERDA]);

	Core::Instancia()->Teclas().al_soltar.arriba.Dessuscribir(&callbacks[SOLTAR][ARRIBA]);
	Core::Instancia()->Teclas().al_soltar.abajo.Dessuscribir(&callbacks[SOLTAR][ABAJO]);
	Core::Instancia()->Teclas().al_soltar.derecha.Dessuscribir(&callbacks[SOLTAR][DERECHA]);
	Core::Instancia()->Teclas().al_soltar.izquierda.Dessuscribir(&callbacks[SOLTAR][IZQUIERDA]);
	
	Core::Instancia()->EliminarCallback(&callback_actualizar);
}

void ControladorDeJugador::Actualizar()
{
	if(tecla_activa[ARRIBA])
	{
		modelo->Mover(N);
	}
	else if(tecla_activa[ABAJO])
	{
		modelo->Mover(S);
	}
	else if(tecla_activa[DERECHA])
	{
		modelo->Mover(E);
	}
	else if(tecla_activa[IZQUIERDA])
	{
		modelo->Mover(O);
	}
}

void ControladorDeJugador::AlTocarArriba()		{ tecla_activa[ARRIBA] = true; }
void ControladorDeJugador::AlTocarAbajo()		{ tecla_activa[ABAJO] = true; }
void ControladorDeJugador::AlTocarDerecha()		{ tecla_activa[DERECHA] = true; }
void ControladorDeJugador::AlTocarIzquierda()	{ tecla_activa[IZQUIERDA] = true; }

void ControladorDeJugador::AlSoltarArriba()		{ tecla_activa[ARRIBA] = false; }
void ControladorDeJugador::AlSoltarAbajo()		{ tecla_activa[ABAJO] = false; }
void ControladorDeJugador::AlSoltarDerecha()	{ tecla_activa[DERECHA] = false; }
void ControladorDeJugador::AlSoltarIzquierda()	{ tecla_activa[IZQUIERDA] = false; }
